package proxy;

import com.alibaba.fastjson.JSONObject;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by fengtingxin on 2020/2/26.
 */
public class MyInvocationHandler implements InvocationHandler {

    /**
     * 目标对象
     */
    private Object target;

    public MyInvocationHandler(Object target){
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("==代理方法开始执行");
        Object invoke = method.invoke(target, args);
        System.out.println("==代理方法结束执行");
        return invoke;
    }


    public Object getProxy(){
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),target.getClass().getInterfaces(),this);
    }


    public static void main(String[] args) {
        // JDK动态代理
        MyInvocationHandler handler = new MyInvocationHandler(new JDKDog());
        //在运行时生成代理对象
        //JDK动态代理所用到的代理类在程序调用到代理类对象时才由JVM真正创建，JVM根据传进来的业务实现类对象以及方法名 ，
        //动态地创建了一个代理类的class文件并被字节码引擎执行，然后通过该代理类对象进行方法调用
        JDKAnimal proxy = (JDKAnimal) handler.getProxy();
        proxy.sayHello(1,1);
    }
}
